/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


package it.unipd.dei.bd.icineasti.servlet.admin;

import it.unipd.dei.bd.icineasti.servlet.AbstractDatabaseServlet;

import it.unipd.dei.bd.icineasti.database.CreaOAggiornaSpettacoloDatabase;
import it.unipd.dei.bd.icineasti.resource.Spettacolo;
import it.unipd.dei.bd.icineasti.resource.R_Proiettato;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
import java.util.Iterator;

import java.text.SimpleDateFormat;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import java.util.HashMap;
import java.util.Iterator;
import java.text.SimpleDateFormat;

import org.apache.commons.lang3.StringEscapeUtils; 

import org.json.JSONObject;

/**
 * Servlet per la gestione dei singoli spettacoli delle sedi
 * 
 * @author Mattia Coccato
 *
 */
public class GestioneSpettacoloServlet extends AbstractDatabaseServlet {

	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("application/json;charset=utf-8");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();

		Connection con = null;

		if (req.getParameter("codicePalinsesto") == null) return;

		try {
			con = DS.getConnection();

			//disabilito l'autocommit qualora fosse attivo perché tutte le informazioni di uno spettacolo devono essere inserite in una stessa
			//transazione, a causa del trigger che controlla le ore di utilizzo dei proiettori
			con.setAutoCommit(false);
			

			if (req.getParameter("delete") == null) {

				SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
		
				String dataString = req.getParameter("dataPrenotabile");
			
				Timestamp dataPrenotabile = new Timestamp((new java.util.Date()).getTime());
				try {
					dataPrenotabile = new Timestamp(formatter.parse(dataString).getTime());
				} catch (Exception ex) {
					//data non era nel formato corretto -> valore non settato perché controllo data manda sempre formato corretto
				}

				int codiceSala = Integer.parseInt(req.getParameter("codiceSala"));
				int codicePalinsesto = Integer.parseInt(req.getParameter("codicePalinsesto"));

				Spettacolo spettacolo = new Spettacolo(0, dataPrenotabile, codicePalinsesto, true);

				CreaOAggiornaSpettacoloDatabase operatore = new CreaOAggiornaSpettacoloDatabase(con, spettacolo);

				int codiceSpettacolo = operatore.inserisciSpettacolo();

				JSONObject jsonProiettori = new JSONObject(req.getParameter("proiettori"));

				Iterator<String> iteratoreChiavi = jsonProiettori.keys();

				while (iteratoreChiavi.hasNext()) {
					String chiave = iteratoreChiavi.next();
					int idProiettore = Integer.parseInt(chiave); //la chiave è l'ID del proiettore
					int minutiUtilizzo = Integer.parseInt(jsonProiettori.getString(chiave));
				
					R_Proiettato prj = new R_Proiettato(codiceSpettacolo, idProiettore, minutiUtilizzo, codiceSala);

					operatore.inserisciInformazioneDiProiezione(prj);
				}


				//solo ora posso fare il commit della transazione
				con.commit();

				out.printf("<p class=\"ok\">Inserimento avvenuto con successo</p>");

			} else {
				int codiceSpettacolo = Integer.parseInt(req.getParameter("codiceSpettacolo"));
				Spettacolo spettacolo = new Spettacolo (codiceSpettacolo, null, 0, false);
				CreaOAggiornaSpettacoloDatabase operatore = new CreaOAggiornaSpettacoloDatabase(con, spettacolo);
				operatore.eliminaSpettacolo();

				con.commit();

				out.printf("<p class=\"ok\">Eliminato con successo</p>");
			}

		} catch (NullPointerException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Impossibile creare la connessione al database.</p>");
		} catch (SQLException e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Errore durante l'accesso al database: %s</p>",
			e.getMessage());
			try {
				con.rollback();
			}  catch (SQLException ex) {}
		} catch (Exception e) {
			// messaggio d'errore
			out.printf("<p class=\"errore\">Errore durante l'accesso al database: %s</p>",
			e.getMessage());
		} finally {
			try {
				if (con != null) con.close(); 
			}  catch (SQLException e) {}
		}

		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
		// out.close();

	}


	

}
